home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / lalr.lha / lalr / src / Final.mi < prev    next >
Text File  |  1992-08-18  |  2KB  |  79 lines

  1. (* map final states to productions *)
  2.  
  3. (* $Id: Final.mi,v 2.1 1991/11/21 14:53:14 grosch rel $ *)
  4.  
  5. (* $Log: Final.mi,v $
  6.  * Revision 2.1  1991/11/21  14:53:14  grosch
  7.  * new version of RCS on SPARC
  8.  *
  9.  * Revision 2.0  91/03/08  18:31:41  grosch
  10.  * turned tables into initialized arrays (in C)
  11.  * moved mapping tokens -> strings from Errors to Parser
  12.  * changed interface for source position
  13.  * 
  14.  * Revision 1.1  90/06/12  16:54:07  grosch
  15.  * renamed main program to lalr, added { } for actions, layout improvements
  16.  * 
  17.  * Revision 1.0     88/10/04  14:36:14  vielsack
  18.  * Initial revision
  19.  * 
  20.  *)
  21.  
  22. IMPLEMENTATION MODULE Final;
  23.  
  24.   FROM Automaton IMPORT
  25.     tProduction,
  26.     ProdArrayPtr,
  27.     tStateKind,
  28.     tStateIndex,
  29.     StateArrayPtr, StateIndex,
  30.     tItemIndex,
  31.     ItemArrayPtr;
  32.  
  33.   FROM DynArray IMPORT MakeArray;
  34.  
  35.   FROM Gen IMPORT
  36.     ElmtSize,
  37.     NoState,
  38.     ReduceOffset,
  39.     FinalToProd,
  40.     FinalToProdCount,
  41.     FirstReadTermState,
  42.     LastReadNonTermState;
  43.   
  44.   FROM SYSTEM IMPORT ADR,TSIZE;
  45.  
  46.   PROCEDURE MakeFinalToProd;
  47.     VAR
  48.       state, maxState : tStateIndex;
  49.       prod : tProduction;
  50.     BEGIN
  51.       FinalToProdCount := LastReadNonTermState-FirstReadTermState+1;
  52.       MakeArray (FinalToProd,FinalToProdCount,ElmtSize);
  53.       FOR state := FirstReadTermState TO LastReadNonTermState DO
  54.     FinalToProd^[state-FirstReadTermState] := NoState;
  55.       END;
  56.  
  57.       (* Betrachte alle Zustaende *)
  58.  
  59.       maxState := StateIndex;
  60.       FOR state := 1 TO maxState DO
  61.       WITH StateArrayPtr^[state] DO
  62.  
  63.     (* Final Zustaende *)
  64.  
  65.     IF (* ((Kind = sTerm) OR (Kind = sNonterm)) AND *)
  66.        (FirstReadTermState <= NewNumber) AND
  67.        (NewNumber <= LastReadNonTermState) THEN
  68.  
  69.       prod := ADR (ProdArrayPtr^[ItemArrayPtr^[Items].Prod]);
  70.       FinalToProd^[NewNumber-FirstReadTermState] := prod^.ProdNo + ReduceOffset;
  71.     END;
  72.  
  73.       END;
  74.       END;
  75.  
  76.     END MakeFinalToProd;
  77.  
  78. END Final.
  79.